<html>
    <head>
        <title>理解分层解决方案结构</title>
    </head>
    <body>
        <script>
              /*
                        二、理解分层解决方案结构

                                1、Domaim.Shared 项目

                                            该项目包含常量、枚举和其他对象，这些对象实际上是域层的一部分，但需要被解决方案中的所有层/项目使用。

                                            BookType枚举和BookConsts类（可能有一些常量字段用于Book实体，如MaxNameLength）是该项目的良好候选者。

                                            ★、该项目不依赖于解决方案中的其他项目。所有其他项目都直接或间接地依赖于这个项目。

                                2、Domain 项目

                                            这是解决方案的领域层。
                                            
                                            它主要包含 "实体"、"聚合根"、"领域服务"、"值对象"、"存储库接口"  和其他域对象。

                                            ★、本项目依赖于 Domain.Shared 项目。

                                                    因为它需要使用 Domain.Shared 项目中的常量、枚举和其他对象。

                                3、Application.Contracts 项目

                                            本项目主要包含应用层的 "应用服务接口" 和 "数据传输对象（DTO）"。
                                            
                                            它的存在是为了分离应用层的接口和实现。
                                            
                                            这样，接口项目可以作为合同包共享给客户端。

                                            ★、本项目依赖于 Domain.Shared 项目。

                                                    因为它需要使用 Domain.Shared 项目中的常量、枚举和其他对象。

                                4、Application  项目

                                            ★、依赖于.Application.Contracts项目，需要 实现服务接口 和 使用Dto
                                            
                                            ★、依赖于.Domain项目，使用领域对象（实体、存储库接口…等）来实现应用服务逻辑。


                                5、EntityFrameworkCore 项目
                                
                                            这是EF Core的集成项目。它定义了DbContext并实现了.Domain项目。

                                            ★、依赖于.Domain项目，需要引用 "实体" 和 "存储库接口"。


                                6、DbMigrator项目

                                            这是一个控制台应用程序，可简化在开发和生产环境中执行数据库迁移。
                                            
                                            当您运行此应用程序时，它会：

                                                    ①、如有必要，创建数据库。

                                                    ②、应用即将发生的、迫近的的数据库迁移

                                                    ③、如果需要，播种初始数据。

                                            ★、这个项目有自己的appsettings.json文件。因此，如果要更改数据库连接字符串，请记住也更改此文件。、

                                            特别是，播种初始数据在这一点上很重要。
                                            
                                            ABP有一个模块化的数据种子基础设施。有关数据播种的更多信息，请参阅其留档。

                                            （虽然创建数据库和应用迁移似乎只需要关系数据库，但即使您选择了非关系型数据库提供程序（如MongoDB），该项目也会出现。在这种情况下，它仍然播种应用程序所需的初始数据。）

                                            ★、依赖于.EntityFrameworkCore项目（用于EF Core），因为它需要访问迁移。

                                            ★、依赖于.Application.Contracts项目，因为需要访问权限定义，因为初始数据播种器默认将所有权限授予管理员角色。



                                6、HttpApi 项目

                                            该项目用于定义您的API控制器。

                                            多数时候，您不需要手动定义API控制器，因为ABP的Auto API Controller功能会根据您的应用层自动创建它们。

                                            但是，如果您需要编写API控制器，这是最好的地方。
                               

                                            ★、依赖于.Application.Contracts项目能够注入应用程序服务接口。

                                                            因为要调用服务接口和使用DTO来创建控制器。

                                7、HttpApi.Client项目

                                            这是一个定义C#客户端代理以使用解决方案的HTTP API的项目。

                                            您可以将此库共享给第3方客户端，以便他们可以在其Dotnet应用程序中轻松使用您的HTTP API
                                            
                                            （对于其他类型的应用程序，他们仍然可以手动或使用自己平台中的工具）

                                            大多数时候，您不需要手动创建C#客户端代理，这要归功于ABP的Dynamic C#API Clients功能。

                                            ★、依赖于 Application.Contracts项目能够与远程服务共享相同的应用程序服务接口和DTO。


                                8、Web 项目

                                           如果您使用ASP.NETCore MVC UI，此项目包含应用程序的用户界面（UI）。它包含Razor页面、JavaScript文件、CSS文件、图像等…

                                           该项目包含主appsettings.json文件，其中包含连接字符串和应用程序的其他配置。

                                           ★、依赖于.HttpApi项目，因为UI层需要使用API和解决方案的应用程序服务接口。

                                                （  
                                                        如果您检查.Web.csproj文件，您将看到对.Application和.EntityFrameworkCore项目。
                                                    
                                                        在编写UI层时实际上不需要这些引用，因为UI层通常不依赖于EF Core或应用层的实现。
                                                        
                                                        这些启动模板已准备好进行分层部署，其中API层托管在与UI层不同的单独服务器上。

                                                        但是，如果您不选择--tiered选项，这些引用将在. Web项目能够在单个应用程序端点中托管Web、API和应用程序层。
                                                        
                                                        这使您能够在表示层中使用域实体和存储库。但是，根据DDD，这被认为是一种不好的做法
                                                  ）


                                 9、怎么运行解决方案？


                                           您可以打开Solution Runner面板并启动所有应用程序。默认用户名为admin，密码为 1q2w3E*。
                    */
        </script>
    </body>
</html>